package cn.zyx.common;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * $.ajax后需要接受的JSON
 * @author zyx
 * 序列化是将对象状态保存为一系列字节的过程，反序列化则是将这些字节恢复为原始对象的过程。
 * 当需要将对象保存到文件或数据库中，或者通过网络传输对象时，必须实现 Serializable 接口
 */
public class GlobalAjaxJson extends HashMap<String,Object> implements Serializable {

    public GlobalAjaxJson(){
        this.put("success", true);
        this.put("code", HttpStatus.OK.value());
        this.put("msg", "操作成功");
    }

    @Override
    public GlobalAjaxJson put(String key, Object value) {
        super.put(key, value);
        return this;
    }

    public GlobalAjaxJson putMap(Map m) {
        super.putAll(m);
        return this;
    }

    public static GlobalAjaxJson success() {
        return new GlobalAjaxJson();
    }

    public static GlobalAjaxJson success(Map<String, Object> map) {
        GlobalAjaxJson globalAjaxJson = new GlobalAjaxJson();
        globalAjaxJson.putAll(map);
        return globalAjaxJson;
    }

    /**
     * 返回对象时忽略此属性
     * @JsonIgnore 用于在序列化和反序列化 JSON 数据时忽略类的某些字段、方法或构造器
     * 核心作用是在生成或解析 JSON 数据时排除特定元素，确保数据隐私、减少网络传输量、或忽略不需要的字段
     * 1.隐藏敏感数据：对于不想在 JSON 中传输的敏感信息（例如密码）进行隐藏
     * 2.减少数据量：在序列化时排除不必要的信息，减少 JSON 大小
     * 3.避免无限递归：在双向关联的情况下，防止循环依赖导致的无限递归问题
     *    例如，类 A 和类 B 互相引用，可以通过 @JsonIgnore 防止序列化时的死循环
     * @param msg
     * @return AjaxJson
     */
    @JsonIgnore
    public static GlobalAjaxJson success(String msg) {
        GlobalAjaxJson globalAjaxJson = new GlobalAjaxJson();
        globalAjaxJson.setMsg(msg);
        return globalAjaxJson;
    }

    @JsonIgnore
    public static GlobalAjaxJson error(String msg) {
        GlobalAjaxJson globalAjaxJson = new GlobalAjaxJson();
        globalAjaxJson.setSuccess(false);
        globalAjaxJson.setMsg(msg);
        return globalAjaxJson;
    }

    public boolean isSuccess() {
        return (boolean)this.get("success");
    }

    public void setSuccess(boolean success) {
        this.put("success", success);
    }

    public int getCode() {
        return (int)this.get("code");
    }

    public void setCode(int code) {
        this.put("code", code);
    }

    // 向json中添加属性，在js中访问，请调用data.msg
    public String getMsg() {
        return (String)this.get("msg");
    }

    public void setMsg(String msg) {
        this.put("msg", msg);
    }

}
